//TodoEvents  处理所有用户交互事件

class TodoEvents{
      /**
     * 构造函数
     * @param {TodoUI} todoUI - UI渲染实例
     * @param {Array} todoStore - 任务数据存储
     */

      constructor(todoUI,todoStore){
        this.todoUI=todoUI
        this.todoStore=todoStore
        this.editModal=new bootstrap.Modal(document.getElementById('edit-modal'))

        this.initEventListeners()
      }

    // 初始化所有事件监听器
      initEventListeners(){
          // 添加任务表单提交事件
        document.getElementById('add-todo-form').addEventListener('submit', this.handleAddTodo.bind(this))
        
        // 任务操作事件（使用事件委托）
        document.getElementById('todo-list').addEventListener('click', this.handleTodoActions.bind(this))
        
        // 编辑任务保存按钮
        document.getElementById('save-edit-btn').addEventListener('click', this.handleSaveEdit.bind(this))
        
        // 过滤按钮点击事件
        document.querySelectorAll('.filter-btn').forEach(btn => {
            btn.addEventListener('click', this.handleFilter.bind(this));
        })

          document.getElementById('search-btn').addEventListener('click', this.handleSearch.bind(this));
        document.getElementById('search-input').addEventListener('keypress', e => {
            if (e.key === 'Enter') {
                this.handleSearch(e);
            }
        });

      }

         /**
     * 处理添加任务
     * @param {Event} e - 表单提交事件
     */

          handleAddTodo(e) {
        e.preventDefault();
        
        // 获取表单数据
        const titleInput = document.getElementById('todo-title');
        const descriptionInput = document.getElementById('todo-description');
        const priorityInput = document.getElementById('todo-priority');
        
        const title = titleInput.value.trim();
        const description = descriptionInput.value.trim();
        const priority = priorityInput.value;
        
        if (!title) {
            alert('请输入任务标题！');
            return;
        }
        
        // 创建新任务对象
        const newTodo = {
            id: Date.now(), // 使用时间戳作为临时ID
            title,
            description,
            priority,
            completed: false,
            created_at: new Date().toISOString()
        };
        
        try {
            // 添加到本地存储
            this.todoStore.push(newTodo);
            
            // 更新UI
            this.todoUI.addTodoToList(newTodo, this.todoStore);
            
            // 重置表单
            titleInput.value = '';
            descriptionInput.value = '';
            priorityInput.value = '中';
            
            // 提示成功
            this.showToast('添加成功', 'success');
        } catch (error) {
            console.error('添加任务出错:', error);
            this.showToast('添加失败: ' + error.message, 'danger');
        }
    }


      /**
     * 处理任务相关操作（完成状态切换、编辑、删除）
     * @param {Event} e - 点击事件
     */

       handleTodoActions(e) {
        const target = e.target;
        const todoItem = target.closest('.todo-item');
        
        if (!todoItem) return;
        
        const todoId = todoItem.dataset.id;
        const todoIndex = this.todoStore.findIndex(todo => todo.id.toString() === todoId);
        
        if (todoIndex === -1) return;
        
        // 完成状态切换
        if (target.classList.contains('toggle-status') || target.closest('.toggle-status')) {
            this.toggleTodoStatus(todoId, todoIndex);
        }
        
        // 编辑任务
        if (target.classList.contains('edit-btn') || target.closest('.edit-btn')) {
            this.openEditModal(todoIndex);
        }
        
        // 删除任务
        if (target.classList.contains('delete-btn') || target.closest('.delete-btn')) {
            this.deleteTodo(todoId, todoIndex);
        }
    }

      /**
     * 切换任务完成状态
     * @param {string} todoId - 任务ID
     * @param {number} todoIndex - 任务在数组中的索引
     */

          toggleTodoStatus(todoId, todoIndex) {
        try {
            // 更新本地存储
            const todo = this.todoStore[todoIndex];
            todo.completed = !todo.completed;
            
            // 更新UI
            this.todoUI.updateTodoElement(todo, this.todoStore);
            
            // 提示成功
            this.showToast(`任务已${todo.completed ? '完成' : '恢复未完成'}`, 'success');
        } catch (error) {
            console.error('更新任务状态出错:', error);
            this.showToast('更新状态失败: ' + error.message, 'danger');
        }
    }

      /**
     * 打开编辑模态框
     * @param {number} todoIndex - 任务在数组中的索引
     */

          openEditModal(todoIndex) {
        const todo = this.todoStore[todoIndex];
        
        // 填充表单
        this.todoUI.fillEditModal(todo);
        
        // 显示模态框
        this.editModal.show();
    }

    // 保存编辑任务
    handleSaveEdit(){
        const todoId = document.getElementById('edit-todo-id').value;
        const todoIndex = this.todoStore.findIndex(todo => todo.id.toString() === todoId);
        
        if (todoIndex === -1) {
            this.showToast('找不到要编辑的任务', 'danger');
            return;
        }

        // 获取表单数据
        const title = document.getElementById('edit-todo-title').value.trim();
        const description = document.getElementById('edit-todo-description').value.trim();
        const priority = document.getElementById('edit-todo-priority').value;
        const completed = document.getElementById('edit-todo-completed').checked;

          if (!title) {
            alert('请输入任务标题！');
            return;
        }

          try {
            // 更新本地存储
            const updatedTodo = {
                ...this.todoStore[todoIndex],
                title,
                description,
                priority,
                completed,
                updated_at: new Date().toISOString()
            }

                this.todoStore[todoIndex] = updatedTodo;
            
            // 更新UI
            this.todoUI.updateTodoElement(updatedTodo, this.todoStore);
            
            // 关闭模态框
            this.editModal.hide();
            
            // 提示成功
            this.showToast('编辑成功', 'success');
        } catch (error) {
            console.error('编辑任务出错:', error);
            this.showToast('编辑失败: ' + error.message, 'danger');
        }
    }


      /**
     * 删除任务
     * @param {string} todoId - 任务ID
     * @param {number} todoIndex - 任务在数组中的索引
     */

         deleteTodo(todoId, todoIndex) {
        if (!confirm('确定要删除该任务吗？')) {
            return;
        }
        
        try {
            // 从本地存储删除
            this.todoStore.splice(todoIndex, 1);
            
            // 更新UI
            this.todoUI.removeTodoFromList(todoId, this.todoStore);
            
            // 提示成功
            this.showToast('删除成功', 'success');
        } catch (error) {
            console.error('删除任务出错:', error);
            this.showToast('删除失败: ' + error.message, 'danger');
        }
    }

        /**
     * 处理过滤器点击
     * @param {Event} e - 点击事件
     */
    handleFilter(e) {
        const filterBtn = e.target.closest('.filter-btn');
        if (!filterBtn) return;
        
        // 更新按钮状态
        document.querySelectorAll('.filter-btn').forEach(btn => {
            btn.classList.remove('active');
        });
        filterBtn.classList.add('active');
        
        // 设置过滤器并重新渲染
        const filter = filterBtn.dataset.filter;
        this.todoUI.setFilter(filter);
        this.todoUI.renderTodoList(this.todoStore);
    }

        handleSearch(e) {
        e.preventDefault();
        
        const searchInput = document.getElementById('search-input');
        const searchTerm = searchInput.value.trim();
        
        // 设置搜索词并重新渲染
        this.todoUI.setSearchTerm(searchTerm);
        this.todoUI.renderTodoList(this.todoStore);
    }

        /**
     * 显示提示消息
     * @param {string} message - 消息内容
     * @param {string} type - 消息类型 (success, danger, warning, info)
     */
    showToast(message, type = 'info') {
        // 创建toast元素
        const toastContainer = document.createElement('div');
        toastContainer.className = 'toast-container position-fixed bottom-0 end-0 p-3';
        toastContainer.style.zIndex = '5';
        
        const toast = document.createElement('div');
        toast.className = `toast show bg-${type} text-white`;
        toast.setAttribute('role', 'alert');
        toast.setAttribute('aria-live', 'assertive');
        toast.setAttribute('aria-atomic', 'true');
        
        toast.innerHTML = `
            <div class="d-flex">
                <div class="toast-body">
                    ${message}
                </div>
                <button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
            </div>
        `;
        
        toastContainer.appendChild(toast);
        document.body.appendChild(toastContainer);
        
        // 3秒后自动移除
        setTimeout(() => {
            toastContainer.remove();
        }, 3000);
    }
}